From 77e844ac767e132727d5b8af9d928fec6546ad5e Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Thu, 9 Feb 2006 13:48:05 -0700 Subject: [PATCH] [IA64] evtchn_ia64 spin lock - fix dead lock added spin_unlock() in case error occurs. Signed-off-by: Isaku Yamahata --- .../arch/ia64/xen/drivers/evtchn_ia64.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c index 0dde420095..fa753e512b 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c @@ -106,8 +106,10 @@ int bind_virq_to_irqhandler( BUG_ON(HYPERVISOR_event_channel_op(&op) != 0 ); evtchn = op.u.bind_virq.port; - if (!unbound_irq(evtchn)) - return -EINVAL; + if (!unbound_irq(evtchn)) { + evtchn = -EINVAL; + goto out; + } evtchns[evtchn].handler = handler; evtchns[evtchn].dev_id = dev_id; @@ -115,6 +117,7 @@ int bind_virq_to_irqhandler( irq_info[evtchn] = mk_irq_info(IRQT_VIRQ, virq, evtchn); unmask_evtchn(evtchn); +out: spin_unlock(&irq_mapping_update_lock); return evtchn; } @@ -125,8 +128,10 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn, { spin_lock(&irq_mapping_update_lock); - if (!unbound_irq(evtchn)) - return -EINVAL; + if (!unbound_irq(evtchn)) { + evtchn = -EINVAL; + goto out; + } evtchns[evtchn].handler = handler; evtchns[evtchn].dev_id = dev_id; @@ -134,6 +139,7 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn, irq_info[evtchn] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); unmask_evtchn(evtchn); +out: spin_unlock(&irq_mapping_update_lock); return evtchn; } @@ -158,7 +164,7 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id) spin_lock(&irq_mapping_update_lock); if (unbound_irq(irq)) - return; + goto out; op.cmd = EVTCHNOP_close; op.u.close.port = evtchn; @@ -179,6 +185,7 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id) evtchns[evtchn].handler = NULL; evtchns[evtchn].opened = 0; +out: spin_unlock(&irq_mapping_update_lock); } -- 2.30.2